package com.example.blog.Controller;
import com.example.blog.model.Result;
import com.example.blog.Service.UserService;
import com.example.blog.model.UserInfo;
import com.example.blog.utils.JwtUtils;
import com.example.blog.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
//Controller做一些参数校验，Service做业务
@RequestMapping("/user")
@RestController
public class UserController {
    //企业标准:
    // 常量定义全部大写，单词之间使用下划线分割，
    private static  final  String KAPTCHA_SESSION_KEY="HOME_KAPTCHA_SESSION_KEY";
    private  static  final String KAPTCHA_SESSION_DATE="HOME_KAPTCHA_SESSION_DATE";
    //两分钟
    private static final  Long SESSION_TIMEOUT=120*1000L;
    //验证成功:true
    //验证失败:false
    @Autowired
    public UserService userService;
    @RequestMapping("/login")
    public Result login(String userName, String password, String captcha, HttpSession session){
        //参数校验
        //密码校验
        //生成token并且返回
        if(!StringUtils.hasLength(userName)||!StringUtils.hasLength(password)){
            return Result.fail("用户名或者密码为空");
        }
        //密码要和数据库中的密码一致
        UserInfo userInfo=userService.queryByName(userName);
        if(userInfo==null||userInfo.getId()<0){
            return Result.fail("用户不存在");
        }
        //验证加盐后的密码和你输入的密码是否相同，注意哈，数据库存储的是加盐之后的密码
        if(!SecurityUtils.verify(password,userInfo.getPassword())){
            return  Result.fail("密码错误");
        }
        if(!StringUtils.hasLength(captcha)){
            return  Result.fail("验证码没被填写");
        }

        //看验证码是否被填写
        //从Session中获取验证码
       // getAttribute相当于获取指定内容的内容
        String saveCaptcha=(String)session.getAttribute(KAPTCHA_SESSION_KEY);
        Date saveDate=(Date) session.getAttribute(KAPTCHA_SESSION_DATE);

        //比对验证码
        if(captcha.equals(saveCaptcha)){
            //对比日期 ,现在的时候减去验证码持续时间比那个还打，为空是永久生效的
            //为什么放到一起写，因为saveDate又可能是空
        if(saveDate==null||System.currentTimeMillis()-saveDate.getTime()<SESSION_TIMEOUT){
        //密码正确了,并且验证码正确，而且验证码的时间没有过去
        //定义里面存储的信息是什么
        Map<String,Object>claim=new HashMap<>();
        claim.put("id",userInfo.getId());
        claim.put("name",userInfo.getUsername());
        String token= JwtUtils.genToken(claim);

        return Result.success(token);
            }
        }
        return Result.fail("抱歉账号或者密码，验证码错误");
    }

    public  UserInfo queryByName(String username){
        return  userService.queryByName(username);
    }
    public UserInfo queryById(Integer id){
       return userService.queryById(id);
    }
    //获取当前登录用户信息
    @RequestMapping("/getUserInfo")
    public UserInfo getUserInfo(HttpServletRequest request){
        //完全可以从token中拿
        //需要昵称，自己实现一下头像
        //如果页面需要信息较少，且是固定不变的内容，可以把这些信息存储在token中，直接从token中获取（不建议）
        //1.从token中获取用户ID ,2.根据用户ID,获取用户信息
        String token=request.getHeader("usertoken");
        Integer userId=JwtUtils.getUserIdFromToken(token);
        if(userId==null){
            return null;
        }
        return  userService.queryById(userId);
    }
    //获取当前作者信息
    @RequestMapping("getAuthorInfo")
    public  UserInfo getAuthorInfo(Integer blogId){
        if(blogId==null||blogId<0){
            return  null;
        }
        return userService.getAuthorInfo(blogId);
    }
}
